在 CI/CD 流程中,需要在測試和正式環境分別執行,因此必須在 BigQuery 建立測試環境,並告訴 dbt 如何區分這兩種環境。
首先,我們要在 profiles.yml 中為每個環境定義與數據庫的連線。我們團隊需要正式環境和測試環境(用於 CI 測試),分別定義為 "prod" 和 "ci"。以下是 profiles.yml 的範例:
migo-dbt:
target: ci # 預設為 ci
outputs:
prod:
dataset: joshua
job_execution_timeout_seconds: 1800
job_retries: 2
location: US
method: oauth
priority: interactive
project: joshua-1000
threads: 8
type: bigquery
ci:
dataset: joshua_ci
job_execution_timeout_seconds: 1800
job_retries: 2
location: US
method: oauth
priority: interactive
project: joshua-1000
threads: 8
type: bigquery
先前文章中有介紹到我們團隊是透過 dataset 名稱後面加上 ci 來作為測試環境的 dataset,並且有說明我們是如何改寫 dbt 內建的 get_custom_schema macro 來讓 dataset 名稱加上 ci。
在 get_custom_schema 中會判斷 target 是指定為 “prod” 還是 “ci”,如果是 “prod” 則使用原本 dataset 名稱,是 “ci” 則在名稱後面加上 _ci,完整的 macro code 可以參考之前文章。
定義完 profiles.yml 和改寫 get_custom_schema 後,在執行 dbt 指令時,加上 —target 就能指定這次運行要在測試環境還是正式環境,以上是範例指令:
# 正式環境
dbt run --select test_model --target prod
# 測試環境
dbt run --select test_model --target ci
註:在 profiles.yml 中有定義預設的 target 為 ci,如果未填寫 —target,運行指令會等同於填入 —target ci,會運行在測試環境。
如果正式環境和測試環境會用到不同的資料來源(測試環境使用測試資料),可以在 source.yml 中運用 target 來指定不同資料來源,範例程式碼如下:
version: 2
sources:
- name: source_name
database: |
{%- if target.name == "ci" -%} raw_ci
{%- elif target.name == "prod" -%} raw_prod
{%- else -%} invalid_database
{%- endif -%}
schema: source_schema
本篇文章介紹了如何透過 dbt taget 來區分正式和測試環境,下一篇將會介紹在 CI/CD 中如何使用 dbt CLI 指令識別異動 models。